package com.rickpan.service;

import com.rickpan.dto.response.WorkCategoryResponse;
import com.rickpan.entity.WorkCategory;
import com.rickpan.exception.BusinessException;
import com.rickpan.repository.WorkCategoryRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 工作分类服务类
 */
@Service
@Transactional
public class WorkCategoryService {

    private static final Logger logger = LoggerFactory.getLogger(WorkCategoryService.class);

    @Autowired
    private WorkCategoryRepository workCategoryRepository;

    /**
     * 获取用户的所有分类（包括系统分类）
     * @param userId 用户ID
     * @return 分类列表
     */
    @Transactional(readOnly = true)
    public List<WorkCategoryResponse> getUserCategories(Long userId) {
        logger.info("获取用户分类，用户ID: {}", userId);
        
        List<WorkCategory> categories = workCategoryRepository.findByUserIdOrSystemCategories(userId);
        
        return categories.stream()
                .map(WorkCategoryResponse::new)
                .collect(Collectors.toList());
    }

    /**
     * 获取系统分类
     * @return 系统分类列表
     */
    @Transactional(readOnly = true)
    public List<WorkCategoryResponse> getSystemCategories() {
        logger.info("获取系统分类");
        
        List<WorkCategory> categories = workCategoryRepository.findByIsSystemTrueOrderByCreatedAtAsc();
        
        return categories.stream()
                .map(WorkCategoryResponse::new)
                .collect(Collectors.toList());
    }

    /**
     * 创建用户自定义分类
     * @param userId 用户ID
     * @param name 分类名称
     * @param description 分类描述
     * @param color 分类颜色
     * @param icon 分类图标
     * @return 创建的分类
     */
    public WorkCategoryResponse createUserCategory(Long userId, String name, String description, 
                                                 String color, String icon) {
        logger.info("创建用户分类，用户ID: {}, 分类名称: {}", userId, name);
        
        // 检查分类名称是否已存在
        if (workCategoryRepository.existsByUserIdAndName(userId, name)) {
            throw new BusinessException("分类名称已存在");
        }
        
        // 检查是否与系统分类重名
        if (workCategoryRepository.existsByIsSystemTrueAndName(name)) {
            throw new BusinessException("不能与系统分类重名");
        }
        
        WorkCategory category = new WorkCategory(userId, name, description, color, icon);
        WorkCategory savedCategory = workCategoryRepository.save(category);
        
        logger.info("用户分类创建成功，分类ID: {}", savedCategory.getId());
        return new WorkCategoryResponse(savedCategory);
    }

    /**
     * 更新用户自定义分类
     * @param userId 用户ID
     * @param categoryId 分类ID
     * @param name 分类名称
     * @param description 分类描述
     * @param color 分类颜色
     * @param icon 分类图标
     * @return 更新后的分类
     */
    public WorkCategoryResponse updateUserCategory(Long userId, Long categoryId, String name, 
                                                 String description, String color, String icon) {
        logger.info("更新用户分类，用户ID: {}, 分类ID: {}", userId, categoryId);
        
        WorkCategory category = workCategoryRepository.findById(categoryId)
                .orElseThrow(() -> new BusinessException("分类不存在"));
        
        // 检查权限
        if (!category.getUserId().equals(userId)) {
            throw new BusinessException("无权限修改此分类");
        }
        
        // 检查是否为系统分类
        if (category.getIsSystem()) {
            throw new BusinessException("不能修改系统分类");
        }
        
        // 检查名称是否重复（排除自己）
        WorkCategory existingCategory = workCategoryRepository.findByUserIdAndName(userId, name);
        if (existingCategory != null && !existingCategory.getId().equals(categoryId)) {
            throw new BusinessException("分类名称已存在");
        }
        
        // 更新分类信息
        if (name != null) category.setName(name);
        if (description != null) category.setDescription(description);
        if (color != null) category.setColor(color);
        if (icon != null) category.setIcon(icon);
        
        WorkCategory savedCategory = workCategoryRepository.save(category);
        
        logger.info("用户分类更新成功，分类ID: {}", savedCategory.getId());
        return new WorkCategoryResponse(savedCategory);
    }

    /**
     * 删除用户自定义分类
     * @param userId 用户ID
     * @param categoryId 分类ID
     */
    public void deleteUserCategory(Long userId, Long categoryId) {
        logger.info("删除用户分类，用户ID: {}, 分类ID: {}", userId, categoryId);
        
        WorkCategory category = workCategoryRepository.findById(categoryId)
                .orElseThrow(() -> new BusinessException("分类不存在"));
        
        // 检查权限
        if (!category.getUserId().equals(userId)) {
            throw new BusinessException("无权限删除此分类");
        }
        
        // 检查是否为系统分类
        if (category.getIsSystem()) {
            throw new BusinessException("不能删除系统分类");
        }
        
        // TODO: 检查是否有工作记录使用此分类，如果有则不允许删除或提示用户处理
        
        workCategoryRepository.delete(category);
        
        logger.info("用户分类删除成功，分类ID: {}", categoryId);
    }

    /**
     * 根据ID获取分类
     * @param categoryId 分类ID
     * @return 分类信息
     */
    @Transactional(readOnly = true)
    public WorkCategoryResponse getCategoryById(Long categoryId) {
        WorkCategory category = workCategoryRepository.findById(categoryId)
                .orElseThrow(() -> new BusinessException("分类不存在"));
        
        return new WorkCategoryResponse(category);
    }

    /**
     * 检查分类是否属于用户
     * @param userId 用户ID
     * @param categoryId 分类ID
     * @return 是否属于用户
     */
    @Transactional(readOnly = true)
    public boolean isCategoryAccessible(Long userId, Long categoryId) {
        if (categoryId == null) {
            return true; // 允许不设置分类
        }
        
        WorkCategory category = workCategoryRepository.findById(categoryId).orElse(null);
        if (category == null) {
            return false;
        }
        
        // 系统分类所有用户都可以使用
        if (category.getIsSystem()) {
            return true;
        }
        
        // 用户自定义分类只有创建者可以使用
        return category.getUserId().equals(userId);
    }
}
